/*
 * @(#)LogGatewayFilterFactory.java 2021年3月12日
 *
 * Copyright (c) 2010 by rayootech.com. All rights reserved.
 */
package com.nuctech.gateway.filter;

import java.util.Arrays;
import java.util.List;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Mono;

/**
 * 日志控制过滤器工厂，有两个要求【局部过滤器】
 * 1、名字必须【配置名+GatewayFilterFactory】
 * 2、必须继承AbstractGatewayFilterFactory<配置类>
 * 
 * @author lilu
 * @date 2021年3月12日
 * @since 1.0.0
 */
@Slf4j
@Component
public class LogGatewayFilterFactory extends AbstractGatewayFilterFactory<LogGatewayFilterFactory.Config> {
	
	public LogGatewayFilterFactory() {
		super(LogGatewayFilterFactory.Config.class);
	}
	
	/**
	 * 用于从配置文件中获取参数值赋值到配置类中的属性上
	 * @see org.springframework.cloud.gateway.support.ShortcutConfigurable#shortcutFieldOrder()
	 */
	@Override
	public List<String> shortcutFieldOrder() {
		return Arrays.asList("consoleLog", "cacheLog");
	}

	/**
	 * 过滤器逻辑
	 * @see org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory#apply(java.lang.Object)
	 */
	@Override
	public GatewayFilter apply(Config config) {
		return new GatewayFilter() {
			@Override
			public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
				if (config.cacheLog) {
					log.info("cacheLog已经开启了………");
				}
				if (config.consoleLog) {
					log.info("consoleLog已经开启了………");
				}
				return chain.filter(exchange);
			}
		};
	}
	
	/**
	 * 配置类，用于接收配置文件中的对应参数
	 * 
	 * @author lilu
	 * @date 2021年3月12日
	 * @since 1.0.0
	 */
	@Data
	@NoArgsConstructor
	public static class Config {
		private boolean consoleLog;
		private boolean cacheLog;
	}

}
